#ifndef CONEXIONBIDIRECCIONAL_H_
#define CONEXIONBIDIRECCIONAL_H_

#include "../Threads/Thread.h"
#include "Conexion.h"
#include "../Sockets/SocketProtocoloPlano.h"
#include "../Sockets/Socket.h"
#include "../Sockets/Sender.h"
#include "../Sockets/Recever.h"
#include "../../Server/ColaMensajes.h"

/*
 * @class ConexionBidireccional
 *
 * @brief Representa una conexion utilizando un thread en la misma.
 *
 */
class ConexionBidireccional{
public:

	/**
	* Constructor para la conexion bidireccion q arma el handshake
	*/
	ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,ColaMensajes* mensajes);

	/*
	 * Conexion que hace un listen previo
	 */
	ConexionBidireccional(SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajes* colaRecibir,ColaMensajes* colaEnviar);

	/*
	 * Conexion que hace una conexion directa
	 */
	ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajes* colaRecibir,ColaMensajes* colaEnviar);


	virtual int terminar();

	void join();

	int enviar(DTO* dto);

	DTO* recibir();

	bool estaConectado();

	virtual ~ConexionBidireccional();

protected:
	std::string host;

	Socket* socket;
	Sender* sender;
	Recever* recever;

private:
	ColaMensajes* mensajes;
};

#endif /* CONEXIONBIDIRECCIONAL_H_ */
